2023/12/232225字符

函数

package main

import "fmt"

// 自执行函数
func main() {
    num := sum(0.1, 0.2)
    fmt.Println(num)  //--> 0.3

    test(1, "2", .1, .2, .3)
}

// 自定义函数,参数类型统一可写在后面
func sum(a, b float32) float32 {
    return a + b
}

// 剩余参数
func test(a int, b string, nums ... float32) {
    fmt.Println(a, b, nums)  //--> 1 2 [0.1 0.2 0.3]
}

内存分析

与 JS 一致,原始值和引用值的区别

package main

import "fmt"

func main() {
    num := 10
    changeNum(num)
    fmt.Println(num)  //--> 10

    arr := [4]int{ 1, 2, 3, 4 }
    changeArr(arr)
    fmt.Println(arr)  //--> [1 2 3 4]

    sli := make([]int, 3)
    changeSli(sli)
    fmt.Println(sli)  //--> [10 0 0]

    func () {
        fmt.Println("立即执行函数")
    }()
}

func changeNum(num int) {
    num = 20
}

func changeArr(arr [4]int) {
    arr[0] = 100
}

func changeSli(sli []int) {
    sli[0] = 10
}

函数回调

package main

import "fmt"

func main() {
    test(1, func () {
        fmt.Println(2)
    })
}

func test(num int, callback func()) {
    fmt.Println(num)
    callback()
}

return 多个返回值

package main

import "fmt"

func main() {
    sum, product := calculate(2, 3)
    fmt.Println(sum, product)  //--> 5 6
}

// 方式1
func calculate(a, b int)(int, int){
    sum := a + b
    product := a * b
    return sum, product
}

// 方式2
func calculate2(a, b int)(sum int, product int){
    sum = a + b
    product = a * b
    return
}

闭包

package main

import "fmt"

func main() {
    iter := createNum()
    fmt.Println(iter())
    fmt.Println(iter())
    fmt.Println(iter())
}

func createNum() func()int {
    i := 0
    return func ()int {
        i++
        return i
    }
}

defer

package main

import "fmt"

func main() {
    fmt.Println(1)
    defer test(2)  // 延迟执行,像 JS 中的事件循环机制,开启了异步队列
    fmt.Println(3)
}

func test(num int) {
    fmt.Println(num)
}

方法

某个类型上的功能,需要指定接收者调用

package main

import "fmt"

func main() {
    dog := Dog{
        name: "小黑",
        age: 2,
    }
    
    fmt.Println(dog.getName())  //--> 小黑
}

type Dog struct{
    name string
    age int
}

func (d Dog) getName()string {
    return d.name
}